/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controladores;

import controladores.exceptions.IllegalOrphanException;
import controladores.exceptions.NonexistentEntityException;
import controladores.exceptions.PreexistingEntityException;
import entidades.Programacion;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import entidades.Tipoprogramacion;
import entidades.Persona;
import entidades.Etapa;
import entidades.Items;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Andres
 */
public class ProgramacionJpaController {

    public ProgramacionJpaController() {
        emf = Persistence.createEntityManagerFactory("proyectoCongresoPU");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Programacion programacion) throws PreexistingEntityException, Exception {
        if (programacion.getItemsList() == null) {
            programacion.setItemsList(new ArrayList<Items>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Tipoprogramacion tipoprogramacion = programacion.getTipoprogramacion();
            if (tipoprogramacion != null) {
                tipoprogramacion = em.getReference(tipoprogramacion.getClass(), tipoprogramacion.getIdtipoprogramacion());
                programacion.setTipoprogramacion(tipoprogramacion);
            }
            Persona persona = programacion.getPersona();
            if (persona != null) {
                persona = em.getReference(persona.getClass(), persona.getCodigopersona());
                programacion.setPersona(persona);
            }
            Etapa etapa = programacion.getEtapa();
            if (etapa != null) {
                etapa = em.getReference(etapa.getClass(), etapa.getCodigoetapa());
                programacion.setEtapa(etapa);
            }
            List<Items> attachedItemsList = new ArrayList<Items>();
            for (Items itemsListItemsToAttach : programacion.getItemsList()) {
                itemsListItemsToAttach = em.getReference(itemsListItemsToAttach.getClass(), itemsListItemsToAttach.getIditem());
                attachedItemsList.add(itemsListItemsToAttach);
            }
            programacion.setItemsList(attachedItemsList);
            em.persist(programacion);
            if (tipoprogramacion != null) {
                tipoprogramacion.getProgramacionList().add(programacion);
                tipoprogramacion = em.merge(tipoprogramacion);
            }
            if (persona != null) {
                persona.getProgramacionList().add(programacion);
                persona = em.merge(persona);
            }
            if (etapa != null) {
                etapa.getProgramacionList().add(programacion);
                etapa = em.merge(etapa);
            }
            for (Items itemsListItems : programacion.getItemsList()) {
                Programacion oldProgramacionOfItemsListItems = itemsListItems.getProgramacion();
                itemsListItems.setProgramacion(programacion);
                itemsListItems = em.merge(itemsListItems);
                if (oldProgramacionOfItemsListItems != null) {
                    oldProgramacionOfItemsListItems.getItemsList().remove(itemsListItems);
                    oldProgramacionOfItemsListItems = em.merge(oldProgramacionOfItemsListItems);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findProgramacion(programacion.getCodigoprogramacion()) != null) {
                throw new PreexistingEntityException("Programacion " + programacion + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Programacion programacion) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Programacion persistentProgramacion = em.find(Programacion.class, programacion.getCodigoprogramacion());
            Tipoprogramacion tipoprogramacionOld = persistentProgramacion.getTipoprogramacion();
            Tipoprogramacion tipoprogramacionNew = programacion.getTipoprogramacion();
            Persona personaOld = persistentProgramacion.getPersona();
            Persona personaNew = programacion.getPersona();
            Etapa etapaOld = persistentProgramacion.getEtapa();
            Etapa etapaNew = programacion.getEtapa();
            List<Items> itemsListOld = persistentProgramacion.getItemsList();
            List<Items> itemsListNew = programacion.getItemsList();
            List<String> illegalOrphanMessages = null;
            for (Items itemsListOldItems : itemsListOld) {
                if (!itemsListNew.contains(itemsListOldItems)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Items " + itemsListOldItems + " since its programacion field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (tipoprogramacionNew != null) {
                tipoprogramacionNew = em.getReference(tipoprogramacionNew.getClass(), tipoprogramacionNew.getIdtipoprogramacion());
                programacion.setTipoprogramacion(tipoprogramacionNew);
            }
            if (personaNew != null) {
                personaNew = em.getReference(personaNew.getClass(), personaNew.getCodigopersona());
                programacion.setPersona(personaNew);
            }
            if (etapaNew != null) {
                etapaNew = em.getReference(etapaNew.getClass(), etapaNew.getCodigoetapa());
                programacion.setEtapa(etapaNew);
            }
            List<Items> attachedItemsListNew = new ArrayList<Items>();
            for (Items itemsListNewItemsToAttach : itemsListNew) {
                itemsListNewItemsToAttach = em.getReference(itemsListNewItemsToAttach.getClass(), itemsListNewItemsToAttach.getIditem());
                attachedItemsListNew.add(itemsListNewItemsToAttach);
            }
            itemsListNew = attachedItemsListNew;
            programacion.setItemsList(itemsListNew);
            programacion = em.merge(programacion);
            if (tipoprogramacionOld != null && !tipoprogramacionOld.equals(tipoprogramacionNew)) {
                tipoprogramacionOld.getProgramacionList().remove(programacion);
                tipoprogramacionOld = em.merge(tipoprogramacionOld);
            }
            if (tipoprogramacionNew != null && !tipoprogramacionNew.equals(tipoprogramacionOld)) {
                tipoprogramacionNew.getProgramacionList().add(programacion);
                tipoprogramacionNew = em.merge(tipoprogramacionNew);
            }
            if (personaOld != null && !personaOld.equals(personaNew)) {
                personaOld.getProgramacionList().remove(programacion);
                personaOld = em.merge(personaOld);
            }
            if (personaNew != null && !personaNew.equals(personaOld)) {
                personaNew.getProgramacionList().add(programacion);
                personaNew = em.merge(personaNew);
            }
            if (etapaOld != null && !etapaOld.equals(etapaNew)) {
                etapaOld.getProgramacionList().remove(programacion);
                etapaOld = em.merge(etapaOld);
            }
            if (etapaNew != null && !etapaNew.equals(etapaOld)) {
                etapaNew.getProgramacionList().add(programacion);
                etapaNew = em.merge(etapaNew);
            }
            for (Items itemsListNewItems : itemsListNew) {
                if (!itemsListOld.contains(itemsListNewItems)) {
                    Programacion oldProgramacionOfItemsListNewItems = itemsListNewItems.getProgramacion();
                    itemsListNewItems.setProgramacion(programacion);
                    itemsListNewItems = em.merge(itemsListNewItems);
                    if (oldProgramacionOfItemsListNewItems != null && !oldProgramacionOfItemsListNewItems.equals(programacion)) {
                        oldProgramacionOfItemsListNewItems.getItemsList().remove(itemsListNewItems);
                        oldProgramacionOfItemsListNewItems = em.merge(oldProgramacionOfItemsListNewItems);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = programacion.getCodigoprogramacion();
                if (findProgramacion(id) == null) {
                    throw new NonexistentEntityException("The programacion with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Programacion programacion;
            try {
                programacion = em.getReference(Programacion.class, id);
                programacion.getCodigoprogramacion();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The programacion with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<Items> itemsListOrphanCheck = programacion.getItemsList();
            for (Items itemsListOrphanCheckItems : itemsListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Programacion (" + programacion + ") cannot be destroyed since the Items " + itemsListOrphanCheckItems + " in its itemsList field has a non-nullable programacion field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Tipoprogramacion tipoprogramacion = programacion.getTipoprogramacion();
            if (tipoprogramacion != null) {
                tipoprogramacion.getProgramacionList().remove(programacion);
                tipoprogramacion = em.merge(tipoprogramacion);
            }
            Persona persona = programacion.getPersona();
            if (persona != null) {
                persona.getProgramacionList().remove(programacion);
                persona = em.merge(persona);
            }
            Etapa etapa = programacion.getEtapa();
            if (etapa != null) {
                etapa.getProgramacionList().remove(programacion);
                etapa = em.merge(etapa);
            }
            em.remove(programacion);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Programacion> findProgramacionEntities() {
        return findProgramacionEntities(true, -1, -1);
    }

    public List<Programacion> findProgramacionEntities(int maxResults, int firstResult) {
        return findProgramacionEntities(false, maxResults, firstResult);
    }

    private List<Programacion> findProgramacionEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Programacion.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Programacion findProgramacion(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Programacion.class, id);
        } finally {
            em.close();
        }
    }

    public int getProgramacionCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Programacion> rt = cq.from(Programacion.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

}
